using Matrix.Configuration.Events;

namespace Matrix.Configuration.Services
{
    /// <summary>
    /// 配置事件策略解析器接口
    /// 负责决定使用本地事件还是分布式事件
    /// </summary>
    public interface IConfigurationEventStrategyResolver
    {
        /// <summary>
        /// 判断是否应该使用本地事件
        /// </summary>
        /// <param name="eventData">配置变更事件数据</param>
        /// <returns>如果应该使用本地事件则返回true，否则返回false</returns>
        bool ShouldUseLocalEvent(ConfigurationChangedEto eventData);

        /// <summary>
        /// 判断是否应该使用本地事件
        /// </summary>
        /// <param name="batchEventData">批量配置变更事件数据</param>
        /// <returns>如果应该使用本地事件则返回true，否则返回false</returns>
        bool ShouldUseLocalEvent(ConfigurationBatchChangedEto batchEventData);

        /// <summary>
        /// 获取事件优先级
        /// </summary>
        /// <param name="eventData">配置变更事件数据</param>
        /// <returns>事件优先级（数值越大优先级越高）</returns>
        int GetEventPriority(ConfigurationChangedEto eventData);

        /// <summary>
        /// 获取事件路由键
        /// </summary>
        /// <param name="eventData">配置变更事件数据</param>
        /// <returns>事件路由键</returns>
        string GetEventRoutingKey(ConfigurationChangedEto eventData);

        /// <summary>
        /// 判断是否为关键配置
        /// </summary>
        /// <param name="key">配置键</param>
        /// <param name="category">配置分类</param>
        /// <param name="namespace">配置命名空间</param>
        /// <returns>如果是关键配置则返回true，否则返回false</returns>
        bool IsCriticalConfiguration(string key, string category, string @namespace);
    }
}